/* Copyright (c) 2004-2022 peigen.info. All rights reserved. */

package info.peigen.hotpot.common.core.enums;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.annotation.JSONType;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <b>(CardAccountType)</b>
 *
 * @author Peigen
 * @version 1.0.0
 * @since 2021/9/10
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
@JSONType(writeEnumAsJavaBean = true)
public enum CardAccountType implements Messageable {
    /** 为了对抗 Alibaba Java Coding 而存在的注释 */
    Private("Private", "对私", "P"),
    Corporate("Corporate", "对公", "C"),
    Channel_Customer("Channel_Customer", "渠道客户账户", "H"),
    Channel_Merchant("Channel_Merchant", "渠道商户账户", "M"),
    Bankbook_Private("Bankbook_Private", "对私存折账户", "S"),
    Bankbook_Corporate("Bankbook_Corporate", "对公存折账户", "G"),

    /** 不晓得啷格回事 */
    UNKNOWN("--", "不晓得啷格回事", ""),
    ;

    /** 枚举值 */
    String code;

    /** 枚举描述 */
    String message;

    /** 汇付天下 代码 */
    String huifuCode;

    /**
     * 通过枚举<code>code</code>获得枚举
     *
     * @param code 枚举值
     *
     * @return CardAccountType
     */

    public static CardAccountType getByCode(String code) {
        return Stream.of(values())
                .filter(innerEnum -> StrUtil.equals(code, innerEnum.code()))
                .findFirst().orElse(UNKNOWN);
    }

    /**
     * 通过枚举<code>name</code>获得枚举
     *
     * @param name 枚举名
     *
     * @return CardAccountType
     */
    public static CardAccountType getByName(String name) {
        return Stream.of(values())
                .filter(innerEnum -> StrUtil.equalsIgnoreCase(name, innerEnum.name()))
                .findFirst().orElse(UNKNOWN);
    }

    /**
     * 获取全部枚举
     *
     * @return List<CardAccountType>
     */
    public static List<CardAccountType> getAllEnum() {
        return Lists.newArrayList(values());
    }

    /**
     * 获取全部枚举值
     *
     * @return List<String>
     */
    public static List<String> getAllEnumCode() {
        return getAllEnum().stream().map(CardAccountType::code).collect(Collectors.toList());
    }

    /**
     * 通过code获取msg
     *
     * @param code 枚举值
     *
     * @return String
     */
    public static String getMsgByCode(String code) {
        return getByCode(code).message();
    }

    /**
     * 获取枚举code
     *
     * @param innerEnum 枚举
     *
     * @return code
     */
    public static String getCode(CardAccountType innerEnum) {
        return Optional.ofNullable(innerEnum).map(CardAccountType::code).orElse(UNKNOWN.code());
    }

    /**
     * map
     *
     * @return Map
     */
    public static Map<String, String> maps() {
        return Stream.of(values()).collect(Collectors.toMap(CardAccountType::code, CardAccountType::message));
    }

    /**
     * 判断给定的枚举，是否在列表中
     *
     * @param values 列表
     *
     * @return boolean
     */
    public boolean isInList(CardAccountType... values) {
        for (CardAccountType e : values) {
            if (this == e) {
                return true;
            }
        }
        return false;
    }

    /**
     * @return Returns the code.
     */
    @Override
    public String code() {
        return code;
    }

    /**
     * @return Returns the message.
     */
    @Override
    public String message() {
        return message;
    }
}